#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	//1.开启RCC时钟，包括ADC和GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN,ENABLE);
	//配置ADCCLK分频器
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//=12MHz
	//2.配置GPIO输入模式
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//3.配置模拟开关，选择规则组的输入通道
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//采样时间等于55.5个周期,+固定的12.5个ADC周期 = 68个周期;
	//4.配置ADC转换器：包括ADC是单次转换还是连续转换，扫描还是非扫描、有几个通道；触发源是什么，数据对齐是左对济还是右对齐
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//DISABLE单次转换,ENABLE:连续转换
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描
	ADC_InitStructure.ADC_NbrOfChannel = 1;//仅在扫描模式下才需要这个参数
	ADC_Init(ADC1,&ADC_InitStructure);
	//5.开关控制，调用一下ADC_Cmd函数，开启ADC
	ADC_Cmd(ADC1,ENABLE);
	//6.校准
	ADC_ResetCalibration(ADC1);//返回复位校准状态
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回复位校准状态
	ADC_StartCalibration(ADC1);//开始校准
	while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//连续转换仅需要在最开始触发次就行了
}

uint16_t AD_GetValue(void)
{
//	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//单次转换触发转换
//	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//转换完成后,EOC由硬件自动置1，while循环就自动跳出|转换时间=(1/12MHz)*68 = 5.6us|
	return ADC_GetConversionValue(ADC1);//返回值就是AD转换的结果
}
